<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>for循环</title>
  <style>
    span{
      display: inline-block;
      width: 60px;
      height: 30px;
      text-align: center;
      line-height: 30px;
      background-color: lightyellow;
      color: blue;
      border: 1px dotted deeppink;
      margin-right: 2px;
      margin-bottom: 2px;
    }
    .h1{
      text-align: center;
    }
  </style>
  <script>
    // 案例一：找出1-60之间的安全数，每10个一换行，不安全数是即能被7整除又能被5整除的数字。
    // 方法一：使用continue语句
    function test01(){
      // 1. 定义代表满足条件安全数的计数器
      let count = 0
      for (let i = 1; i <= 60 ; i++) {    // 将循环三要素写在一起，更紧凑，便于我们代码的维护
        // 2. 只要是非安全数我们就跳过
        if (i % 7 === 0 && i % 5 === 0){
            continue                      // continue 代表跳过本次循环，接着执行下一次循环
        }
        // 3. 累加计数器
        count++
        // 4. 打印安全数
        document.write("<span>" + i + "</span>")
        // 5. 每10个一换行
        if (count % 10 === 0){
          document.write("<br>")
        }
      }
    }
    // test01()
    // 方法二：不使用continue语句
    function test02(){
        // 1. 定义代表满足条件安全数的计数器
      let count = 0
      for (let i = 1; i <= 60 ; i++) {      // 将循环三要素写在一起，更紧凑，便于我们代码的维护
        // 2. 只要是非安全数我们就跳过
        if (!(i % 7 === 0 && i % 5 === 0)){ // 可以将安全数取反变成非安全数
          // 3. 累加计数器
          count++
          // 4. 打印安全数
          document.write("<span>" + i + "</span>")
          // 5. 每10个一换行
          if (count % 10 === 0){
            document.write("<br>")
          }
        }
      }
    }
    // test02()

    /**
     * 案例二：求1-100之间所有的完数，完数就是将一个数分解公因式，得到的各个数加起来等于它自身，如：6 = 1 + 2 + 3
     * 分析：
     *   求公因式方法：可以循环1-100,循环变量比如为i，增加一个内层循环，在内层循环中从2到当前正在遍历的i（循环变量j）再构造一个内部循环，
     *   将当前循环变量i除以当前内层循环变量j，如果除得尽，就得到当前循环变量i的公因数，在内层循环中累加公因数，然后在外层循环的最后比较
     *   累加的公因数是否是外层循环的变量i的值，如果相等则是完数。
     */
    function test03(){
      // 2.1 定义一个求和变量（用于累加因子之和）
      let sum = 0
      // 2.2 构造外层循环，
      document.write("1-100之间所有完数如下：<hr>")
      for (let i = 1; i <= 100 ; i++) {
        sum = 0   // 这是清零操作，这样才能保证每次得到的是正确的公因式
        for (let j = 2; j <= i; j++) {
          // 2.2.1 如果找到了公因数，就放在sum中
          if (i % j === 0){
            sum += i / j
          }
        }
        // 2.2.2 比较sum是否与i相等，相等证明是完数
        if (sum === i){
          document.write(i + " ")
        }
      }
    }
    // test03()

    /**
     * 案例二：打印直角三角形
     * *
     * * *
     * * * *
     * * * * *
     * * * * * *
     * 分析：
     *   *号的个数与循环的的变量值一致
      */
    function test04(){
      for (let i = 1; i <= 9; i++) {
        for (let j = 1; j <= i; j++) {
          document.write("* ")
        }
        document.write("<br>")
      }
    }
  // test04()
  /**
   * 案例三：打印九九乘法表
    */
  function test05(){
    document.write("<h1 class='h1'>九九乘法表 <hr color='red' size='3'></h1>")
    for (let i = 1; i <= 9; i++) {
      for (let j = 1; j <= i ; j++) {
        document.write("<span>" + j + "x" + i + "=" + i * j + "</span>")
      }
      document.write("<br>")
    }
  }
  test05()
  </script>
</head>
<body>
</body>
</html>
